package tests;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import utils.HibernateUtil;
import entities.Auteur;
import entities.Boek;
import entities.Contributie;
import entities.Genre;
import entities.Lening;
import entities.Lid;
import entities.Lidmaatschap;
import entities.Medewerker;
import entities.Persoon;
import entities.Rol;

public class Test
{
	public static void main(String[] args)
	{
		Session session = null;
		Transaction tx = null;
		
		try
		{
			// get a session
			session = HibernateUtil.getSessionFactory().openSession();
			
			// Start a tx
			tx = session.beginTransaction();
			
			// create roles
			Rol rol1 = new Rol("Helpdeskmedewerker");
			session.save(rol1);
			
			Rol rol2 = new Rol("Systeembeheerder");
			session.save(rol2);
			
			Rol rol3 = new Rol("Boekbeheerder");
			session.save(rol3);
			
			Rol rol4 = new Rol("Finance manager");
			session.save(rol4);
			
			Rol rol5 = new Rol("Inkoper/Verkoper");
			session.save(rol5);
			
			// create employees
			Set<Rol> roles = new HashSet<Rol>(1);
			roles.add(rol1);
			Calendar cal = new GregorianCalendar(1982, GregorianCalendar.APRIL, 13);
			String naam = "Appelgat";
			String voornaam = "Marietje";
			Date geboortedatum = cal.getTime();
			String rekeningnummer = "6789012345";
			String postcode = "9876AB";
			String gebruikersnaam = "mappe";
			String inlogcode = "mappe1";
			int bsn = 848457475;
			Persoon med1 = new Medewerker(naam, voornaam, geboortedatum, rekeningnummer, gebruikersnaam, inlogcode, bsn);
			med1.setPostcode(postcode);
			session.save(med1);
			
			roles = new HashSet<Rol>(1);
			roles.add(rol2);
			cal = new GregorianCalendar(1992, GregorianCalendar.MAY, 14);
			naam = "Stolk";
			voornaam = "Ferdinand";
			geboortedatum = cal.getTime();
			rekeningnummer = "6789012345";
			postcode = "4567QT";
			gebruikersnaam = "fstol";
			inlogcode = "fstol1";
			bsn = 365247585;
			Persoon med2 = new Medewerker(naam, voornaam, geboortedatum, rekeningnummer, gebruikersnaam, inlogcode, bsn);
			med2.setPostcode(postcode);
			session.save(med2);
			
			roles = new HashSet<Rol>(1);
			roles.add(rol3);
			cal = new GregorianCalendar(2002, GregorianCalendar.JUNE, 15);
			naam = "Vaerdt";
			voornaam = "Henk";
			String tussenvoegsel = "van der";
			geboortedatum = cal.getTime();
			rekeningnummer = "3764501928";
			postcode = "1289AZ";
			gebruikersnaam = "pklaa";
			inlogcode = "pklaa1";
			bsn = 787852412;
			Persoon med3 = new Medewerker(naam, voornaam, geboortedatum, rekeningnummer, gebruikersnaam, inlogcode, bsn);
			med3.setPostcode(postcode);
			med3.setTussenvoegsel(tussenvoegsel);
			session.save(med3);
			
			// create members
			cal = new GregorianCalendar(1952, GregorianCalendar.JANUARY, 10);
			naam = "Klaassen";
			voornaam = "Piet";
			geboortedatum = cal.getTime();
			postcode = "1234AB";
			rekeningnummer = "1234567890";
			gebruikersnaam = "pklaa";
			inlogcode = "pklaa1";
			bsn = 525254123;
			Persoon lid1 = new Lid(naam, voornaam, geboortedatum, rekeningnummer, gebruikersnaam, inlogcode, bsn);
			session.save(lid1);
			
			cal = new GregorianCalendar(1962, GregorianCalendar.FEBRUARY, 11);
			naam = "Waardt";
			voornaam = "Bob";
			tussenvoegsel = "de";
			geboortedatum = cal.getTime();
			postcode = "4321BA";
			rekeningnummer = "0987654321";
			gebruikersnaam = "bwaar";
			inlogcode = "bwaar1";
			bsn = 865412212;
			Persoon lid2 = new Lid(naam, voornaam, geboortedatum, rekeningnummer, gebruikersnaam, inlogcode, bsn);
			lid2.setTussenvoegsel(tussenvoegsel);
			session.save(lid2);
			
			cal = new GregorianCalendar(1972, GregorianCalendar.MARCH, 12);
			naam = "Bol";
			voornaam = "Jan";
			geboortedatum = cal.getTime();
			postcode = "9876ZY";
			rekeningnummer = "0192837645";
			gebruikersnaam = "jabol";
			inlogcode = "jabol1";
			bsn = 241241253;
			Persoon lid3 = new Lid(naam, voornaam, geboortedatum, rekeningnummer, gebruikersnaam, inlogcode, bsn);
			session.save(lid3);
			
			// create memberships
			cal = new GregorianCalendar(2012, GregorianCalendar.DECEMBER, 1);
			cal.set(GregorianCalendar.DAY_OF_MONTH, cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
			Lidmaatschap lm1 = new Lidmaatschap((Lid)lid1, cal.getTime());
			session.save(lm1);
			cal = new GregorianCalendar(2013, GregorianCalendar.DECEMBER, 1);
			cal.set(GregorianCalendar.DAY_OF_MONTH, cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
			Lidmaatschap lm2 = new Lidmaatschap((Lid)lid1, cal.getTime());
			session.save(lm2);
			
			cal = new GregorianCalendar(2012, GregorianCalendar.DECEMBER, 1);
			cal.set(GregorianCalendar.DAY_OF_MONTH, cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
			Lidmaatschap lm3 = new Lidmaatschap((Lid)lid2, cal.getTime());
			session.save(lm3);
			cal = new GregorianCalendar(2013, GregorianCalendar.DECEMBER, 1);
			cal.set(GregorianCalendar.DAY_OF_MONTH, cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
			Lidmaatschap lm4 = new Lidmaatschap((Lid)lid2, cal.getTime());
			session.save(lm4);
			
			cal = new GregorianCalendar(2012, GregorianCalendar.DECEMBER, 1);
			cal.set(GregorianCalendar.DAY_OF_MONTH, cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
			Lidmaatschap lm5 = new Lidmaatschap((Lid)lid3, cal.getTime());
			session.save(lm5);
			cal = new GregorianCalendar(2013, GregorianCalendar.DECEMBER, 1);
			cal.set(GregorianCalendar.DAY_OF_MONTH, cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
			Lidmaatschap lm6 = new Lidmaatschap((Lid)lid3, cal.getTime());
			session.save(lm6);
			
			// create contributions
			Contributie con1 = new Contributie(lm1, new BigDecimal(35.95));
			session.save(con1);
			Contributie con2 = new Contributie(lm1, new BigDecimal(35.95));
			session.save(con2);
			Contributie con3 = new Contributie(lm1, new BigDecimal(35.95));
			session.save(con3);
			Contributie con4 = new Contributie(lm1, new BigDecimal(35.95));
			session.save(con4);
			Contributie con5 = new Contributie(lm1, new BigDecimal(35.95));
			session.save(con5);
			Contributie con6 = new Contributie(lm1, new BigDecimal(35.95));
			session.save(con6);
			
			// create genres
			Genre g1 = new Genre("Fantasy");
			session.save(g1);
			Genre g2 = new Genre("Roman");
			session.save(g2);
			Genre g3 = new Genre("Thriller");
			session.save(g3);
			Genre g4 = new Genre("Autobiografie");
			session.save(g4);
			
			// create books
			Boek boek1 = new Boek("Magier");
			boek1.setGenre(g1);
			session.save(boek1);
			Boek boek2 = new Boek("Jimmie de Hand");
			boek2.setGenre(g1);
			session.save(boek2);
			Boek boek3 = new Boek("Dochter van het Keizerrijk");
			boek3.setGenre(g2);
			session.save(boek3);
			
			// create authors
			Set<Boek> boeken = new HashSet<Boek>();
			boeken.add(boek1);
			boeken.add(boek2);
			boeken.add(boek3);
			Auteur a1 = new Auteur("Feist", "Raymond E.", boeken);
			session.save(a1);
			
			boeken = new HashSet<Boek>();
			boeken.add(boek3);
			Auteur a2 = new Auteur("Wurts", "Janny", boeken);
			session.save(a2);
			
			// create a loan
			cal = new GregorianCalendar(2013, GregorianCalendar.MARCH, 10);
			Calendar cal2 = new GregorianCalendar(
					cal.get(GregorianCalendar.YEAR), 
					cal.get(GregorianCalendar.MONTH),
					cal.get(GregorianCalendar.DAY_OF_MONTH));
			cal2.add(GregorianCalendar.WEEK_OF_YEAR, 3); // leen een book voor 3 weken
			Lening len1 = new Lening(cal.getTime(), cal2.getTime(), boek3, (Lid)lid1);
			session.save(len1);
			
			// commit the tx,
			// so that it will be visible in the db
			//session.getTransaction().commit();
			tx.commit();
		}
		catch(RuntimeException e)
		{
			e.printStackTrace();
			
			if(tx != null)
				tx.rollback();
		}
		finally
		{
			if(session != null)
				session.close();
		}
	}
}